package cn.highedu.coolshark_product.controller;

import cn.highedu.coolshark_product.service.ex.ServiceCode;
import cn.highedu.coolshark_product.service.ex.ServiceException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

/**
 * 前后端分离开发模式下 前后端统一响应的数据格式
 */
@Data
public class JsonResult<T> {
    /**
     * 状态码 20000表示成功
     */
    private Integer code;
    /**
     * 操作失败时的信息, 正确的时候设为null
     */
    private String message;
    /**
     * 操作成功时返回的具体数据
     */
    private T data; // T = Type

    public static JsonResult<Void> ok() {
        return ok(null);
    }

    public static <T> JsonResult<T> ok(T data) {
        JsonResult<T> jsonResult = new JsonResult<>();
        jsonResult.setCode(ServiceCode.OK.getValue());
        jsonResult.setMessage("OK");
        jsonResult.setData(data);
        return jsonResult;
    }

    public static JsonResult<Void> fail(ServiceException e) {
        return fail(e.getServiceCode(), e.getMessage());
    }

    public static JsonResult<Void> fail(ServiceCode serviceCode, String message) {
        JsonResult<Void> jsonResult = new JsonResult<>();
        jsonResult.setCode(serviceCode.getValue());
        jsonResult.setMessage(message);
        return jsonResult;
    }
    public String toJson() {
        try {
            return new ObjectMapper().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
